home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UTIL / MEMORY / OLD / MEM208SRC / FSLib / c / _File < prev    next >
Text File  |  1993-08-22  |  4KB  |  143 lines

  1. /* Original code (c) Acorn Computers Ltd, 1992-3 */
  2.  
  3. /* $Id: c._File 3.1 93/03/09 23:09:29 brian Exp $ */
  4. /* #define DEBUG */
  5. #include "FS.h"
  6.  
  7. _kernel_oserror *fsentry_file( FSEntry_File_Parameter *parm )
  8. {
  9.   _kernel_oserror *err = NULL;
  10.   FileEntry *fse = NULL;
  11.   FileDesc d;
  12. #ifdef DEBUG
  13.   printf( "File( %d )%s\n", parm->reason, parm->name );
  14. #endif
  15.   special_field = parm->special_field;
  16.   switch ( parm->reason )
  17.   {
  18.   case FSEntry_File_Reason_LoadFile:
  19.     err=FileEntry_Open( NULL, parm->name, OPENIN, &fse );
  20.     if ( !err )
  21.     { int pos=0,len;
  22.       d = FileEntry_Desc( fse );
  23.       while (pos<d.length)
  24.       { err=FileEntry_GetBytes(fse,parm->info.load_exec.load_address,pos,d.length,&pos,&len);
  25.         if (err) return err;
  26.         if (!len) return ERR(mb_EOF);
  27.       }
  28.       parm->info = d.info;
  29.       parm->extras.info.length = d.length;
  30.       parm->extras.info.attributes = d.attr;
  31.       parm->special_field = FileEntry_Name( fse );
  32.       FileEntry_Close( fse );
  33.     }
  34.     break;
  35.   case FSEntry_File_Reason_CreateFile:
  36.     { int n = parm->extras.location.end-parm->extras.location.start;
  37.       err = FileEntry_Open( NULL, parm->name, CREATE, &fse );
  38.       if ( !err )
  39.       { err = FileEntry_SetLength( fse, n );
  40.         if ( !err )
  41.         { FileEntry_SetInfo( fse, parm->info );
  42.           parm->special_field = FileEntry_Name( fse );
  43.           FileEntry_Close( fse );
  44.         }
  45.         else
  46.         { FileEntry_Close( fse );
  47.           FileEntry_Delete( NULL, parm->name, &d );
  48.         }
  49.       }
  50.     }
  51.     break;;
  52.   case FSEntry_File_Reason_SaveFile:
  53.     { int n = parm->extras.location.end-parm->extras.location.start;
  54.       err = FileEntry_Open( NULL, parm->name, CREATE, &fse );
  55.       if ( !err )
  56.       { err = FileEntry_PutBytes( fse, parm->extras.location.start, 0, n, &n );
  57.         if ( !err )
  58.         { FileEntry_SetInfo( fse, parm->info );
  59.           parm->special_field = FileEntry_Name( fse );
  60.           FileEntry_Close( fse );
  61.         }
  62.         else
  63.         { FileEntry_Close( fse );
  64.           FileEntry_Delete( NULL, parm->name, &d );
  65.         }
  66.       }
  67.     }
  68.     break;
  69.   case FSEntry_File_Reason_WriteCatalogueInformation:
  70. #ifdef DEBUG
  71.     printf( "WriteCatInfo:%p as %x/%x %x\n", fse, parm->info, parm->extras.info.attributes );
  72. #endif
  73.     err = FileEntry_Open( NULL, parm->name, OPENIN, &fse );
  74.     if ( !err )
  75.     { FileEntry_SetInfo( fse, parm->info );
  76.       FileEntry_Close( fse );
  77.     }
  78.     if (!err)
  79.       err = FileEntry_Access( NULL, parm->name, parm->extras.info.attributes );
  80.     break;
  81.   case FSEntry_File_Reason_WriteLoadAddress:
  82.     err = FileEntry_Open( NULL, parm->name, OPENIN, &fse );
  83.     if ( !err )
  84.     { FileDesc d = FileEntry_Desc( fse );
  85.       Information_Fields info = d.info;
  86.       info.load_exec.load_address = parm->info.load_exec.load_address;
  87.       err = FileEntry_SetInfo( fse, info );
  88.       FileEntry_Close( fse );
  89.     }
  90.     break;
  91.   case FSEntry_File_Reason_WriteExecutionAddress:
  92.     err = FileEntry_Open( NULL, parm->name, OPENIN, &fse );
  93.     if ( !err )
  94.     { FileDesc d = FileEntry_Desc( fse );
  95.       Information_Fields info = d.info;
  96.       info.load_exec.execute_address = parm->info.load_exec.execute_address;
  97.       err = FileEntry_SetInfo( fse, info );
  98.       FileEntry_Close( fse );
  99.     }
  100.     break;
  101.  
  102.   case FSEntry_File_Reason_WriteAttributes:
  103.     err = FileEntry_Access( NULL, parm->name, parm->extras.info.attributes );
  104.     break;
  105.  
  106.   case FSEntry_File_Reason_ReadCatalogueInformationNoLength:
  107.   case FSEntry_File_Reason_ReadCatalogueInformation:
  108.     err = FileEntry_Find( NULL, parm->name, &d );
  109.     if ( err )
  110.     { parm->reason = 0;
  111. #ifdef DEBUG
  112.       printf("Find error %d %s\n",err->errnum,err->errmess);
  113. #endif
  114.     }
  115.     else
  116.     { parm->reason = d.type;
  117.       parm->info = d.info;
  118.       parm->extras.info.length = d.length;
  119.       parm->extras.info.attributes = d.attr;
  120.     }
  121.     err = NULL;
  122.     break;
  123.   case FSEntry_File_Reason_DeleteObject:
  124.     {
  125.       err = FileEntry_Delete( NULL, parm->name, &d );
  126.       parm->reason = d.type;
  127.       parm->info = d.info;
  128.       parm->extras.info.length = d.length;
  129.       parm->extras.info.attributes = d.attr;
  130.     }
  131.     break;
  132.   case FSEntry_File_Reason_CreateDirectory: 
  133.     err = FileEntry_Open( NULL, parm->name, CREATEDIR, &fse );
  134.     if (!err)
  135.       FileEntry_Close( fse );
  136.     break;
  137.   default:
  138.     err = ERR(mb_BadParameters);
  139.     break;
  140.   }
  141.   return err;
  142. }
  143.